hikey: migrate to bl2_el3
authorHaojian Zhuang <[email protected]>
Thu, 25 Jan 2018 08:10:14 +0000 (16:10 +0800)
committerHaojian Zhuang <[email protected]>
Mon, 5 Mar 2018 01:51:43 +0000 (09:51 +0800)
Since non-TF ROM is used in HiKey platform (Hisilicon Hi6220 SoC),
replace BL1 by BL2_EL3 in normal boot mode.

When we recovery images in recovery mode, keep to use BL1.

Signed-off-by: Haojian Zhuang <[email protected]>
docs/plat/hikey.rst
plat/hisilicon/hikey/aarch64/hikey_common.c
plat/hisilicon/hikey/hikey_bl1_setup.c
plat/hisilicon/hikey/hikey_bl2_mem_params_desc.c
plat/hisilicon/hikey/hikey_bl2_setup.c
plat/hisilicon/hikey/hikey_io_storage.c
plat/hisilicon/hikey/include/platform_def.h
plat/hisilicon/hikey/platform.mk

index 99259f3a793521a65ab3da838a49c512de8d9973..33e6514f4da2cc940cd09f06dface9d69a43e8d8 100644 (file)
@@ -91,6 +91,7 @@ Build Procedure
 
        cd ${BUILD_PATH}/l-loader
        ln -sf ${EDK2_OUTPUT_DIR}/FV/bl1.bin
+       ln -sf ${EDK2_OUTPUT_DIR}/FV/bl2.bin
        ln -sf ${BUILD_PATH}/atf-fastboot/build/hikey/${FASTBOOT_BUILD_OPTION}/bl1.bin fastboot.bin
        make hikey PTABLE_LST=aosp-8g
 
@@ -142,17 +143,18 @@ Flash images in recovery mode
 
        $sudo apt-get purge modemmanager
 
--  Run the command to download l-loader.bin into HiKey.
+-  Run the command to download recovery.bin into HiKey.
 
    .. code:: shell
 
-       $sudo python hisi-idt.py -d /dev/ttyUSB1 --img1 l-loader.bin
+       $sudo python hisi-idt.py -d /dev/ttyUSB1 --img1 recovery.bin
 
 -  Update images. All aosp or debian images could be fetched from `link <https://builds.96boards.org/>`__.
 
    .. code:: shell
 
        $sudo fastboot flash ptable prm_ptable.img
+       $sudo fastboot flash loader l-loader.bin
        $sudo fastboot flash fastboot fip.bin
        $sudo fastboot flash boot boot.img
        $sudo fastboot flash cache cache.img
index 448857c280fa12e83de1fe7bf436fb81fa782d73..f95af5870febe6d7fc8406b8efb1d5bf1b2484aa 100644 (file)
@@ -64,6 +64,7 @@ static const mmap_region_t hikey_mmap[] = {
        MAP_DDR,
        MAP_DEVICE,
        MAP_TSP_MEM,
+       MAP_SRAM,
        {0}
 };
 #endif
index 9e78a0da012fd049194d38ad4edb50e148bcb76f..6fdfae558908966f61811a2fe27780fdd9a859a5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -529,9 +529,6 @@ unsigned int bl1_plat_get_next_image_id(void)
 
        boot_mode = mmio_read_32(ONCHIPROM_PARAM_BASE);
        switch (boot_mode) {
-       case BOOT_NORMAL:
-               ret = BL2_IMAGE_ID;
-               break;
        case BOOT_USB_DOWNLOAD:
        case BOOT_UART_DOWNLOAD:
                ret = NS_BL1U_IMAGE_ID;
@@ -563,7 +560,7 @@ void bl1_plat_set_ep_info(unsigned int image_id,
        unsigned int data = 0;
 
        if (image_id == BL2_IMAGE_ID)
-               return;
+               panic();
        inv_dcache_range(NS_BL1U_BASE, NS_BL1U_SIZE);
        __asm__ volatile ("mrs  %0, cpacr_el1" : "=r"(data));
        do {
index 50ca01573d28afe78000f6fabc0bae30b5953edd..7c025c34d5adbb38bceb85e978ed7d2a04243cce 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -28,7 +28,7 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = {
                    VERSION_2, entry_point_info_t, SECURE | NON_EXECUTABLE),
 
            SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY,
-                   VERSION_2, image_info_t, 0),
+                   VERSION_2, image_info_t, IMAGE_ATTRIB_PLAT_SETUP),
            .image_info.image_base = SCP_BL2_BASE,
            .image_info.image_max_size = SCP_BL2_SIZE,
 
index 6080f84f2fd7138db435b34b1d0a0fda8c82179a..fc0734528a8943233ae1351cebf9ec0d6e6659c6 100644 (file)
 #include <dw_mmc.h>
 #include <emmc.h>
 #include <errno.h>
+#include <gpio.h>
 #include <hi6220.h>
+#include <hi6553.h>
 #include <hisi_mcu.h>
 #include <hisi_sram_map.h>
 #include <mmio.h>
 #ifdef SPD_opteed
 #include <optee_utils.h>
 #endif
+#include <pl061_gpio.h>
+#include <platform.h>
 #include <platform_def.h>
 #include <sp804_delay_timer.h>
 #include <string.h>
@@ -36,6 +40,8 @@
 #define BL2_RO_BASE (unsigned long)(&__RO_START__)
 #define BL2_RO_LIMIT (unsigned long)(&__RO_END__)
 
+#define BL2_RW_BASE            (BL2_RO_LIMIT)
+
 /*
  * The next 2 constants identify the extents of the coherent memory region.
  * These addresses are used by the MMU setup code and therefore they must be
 #define BL2_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__)
 #define BL2_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__)
 
-static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE);
+static meminfo_t bl2_el3_tzram_layout;
+
+enum {
+       BOOT_MODE_RECOVERY = 0,
+       BOOT_MODE_NORMAL,
+       BOOT_MODE_MASK = 1,
+};
 
 /*******************************************************************************
  * Transfer SCP_BL2 from Trusted RAM using the SCP Download protocol.
@@ -264,29 +276,428 @@ static void hikey_jumper_init(void)
        mmio_write_32(IOMG_GPIO24, IOMG_MUX_FUNC0);
 }
 
-void bl2_early_platform_setup(meminfo_t *mem_layout)
+static void hikey_sp804_init(void)
 {
-       dw_mmc_params_t params;
+       uint32_t data;
+
+       /* select the clock of dual timer0 */
+       data = mmio_read_32(AO_SC_TIMER_EN0);
+       while (data & 3) {
+               data &= ~3;
+               data |= 3 << 16;
+               mmio_write_32(AO_SC_TIMER_EN0, data);
+               data = mmio_read_32(AO_SC_TIMER_EN0);
+       }
+       /* enable the pclk of dual timer0 */
+       data = mmio_read_32(AO_SC_PERIPH_CLKSTAT4);
+       while (!(data & PCLK_TIMER1) || !(data & PCLK_TIMER0)) {
+               mmio_write_32(AO_SC_PERIPH_CLKEN4, PCLK_TIMER1 | PCLK_TIMER0);
+               data = mmio_read_32(AO_SC_PERIPH_CLKSTAT4);
+       }
+       /* reset dual timer0 */
+       data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
+       mmio_write_32(AO_SC_PERIPH_RSTEN4, PCLK_TIMER1 | PCLK_TIMER0);
+       do {
+               data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
+       } while (!(data & PCLK_TIMER1) || !(data & PCLK_TIMER0));
+       /* unreset dual timer0 */
+       mmio_write_32(AO_SC_PERIPH_RSTDIS4, PCLK_TIMER1 | PCLK_TIMER0);
+       do {
+               data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
+       } while ((data & PCLK_TIMER1) || (data & PCLK_TIMER0));
+
+       sp804_timer_init(SP804_TIMER0_BASE, 10, 192);
+}
+
+static void hikey_gpio_init(void)
+{
+       pl061_gpio_init();
+       pl061_gpio_register(GPIO0_BASE, 0);
+       pl061_gpio_register(GPIO1_BASE, 1);
+       pl061_gpio_register(GPIO2_BASE, 2);
+       pl061_gpio_register(GPIO3_BASE, 3);
+       pl061_gpio_register(GPIO4_BASE, 4);
+       pl061_gpio_register(GPIO5_BASE, 5);
+       pl061_gpio_register(GPIO6_BASE, 6);
+       pl061_gpio_register(GPIO7_BASE, 7);
+       pl061_gpio_register(GPIO8_BASE, 8);
+       pl061_gpio_register(GPIO9_BASE, 9);
+       pl061_gpio_register(GPIO10_BASE, 10);
+       pl061_gpio_register(GPIO11_BASE, 11);
+       pl061_gpio_register(GPIO12_BASE, 12);
+       pl061_gpio_register(GPIO13_BASE, 13);
+       pl061_gpio_register(GPIO14_BASE, 14);
+       pl061_gpio_register(GPIO15_BASE, 15);
+       pl061_gpio_register(GPIO16_BASE, 16);
+       pl061_gpio_register(GPIO17_BASE, 17);
+       pl061_gpio_register(GPIO18_BASE, 18);
+       pl061_gpio_register(GPIO19_BASE, 19);
+
+       /* Power on indicator LED (USER_LED1). */
+       gpio_set_direction(32, GPIO_DIR_OUT);   /* LED1 */
+       gpio_set_value(32, GPIO_LEVEL_HIGH);
+       gpio_set_direction(33, GPIO_DIR_OUT);   /* LED2 */
+       gpio_set_value(33, GPIO_LEVEL_LOW);
+       gpio_set_direction(34, GPIO_DIR_OUT);   /* LED3 */
+       gpio_set_direction(35, GPIO_DIR_OUT);   /* LED4 */
+}
+
+static void hikey_pmussi_init(void)
+{
+       uint32_t data;
+
+       /* Initialize PWR_HOLD GPIO */
+       gpio_set_direction(0, GPIO_DIR_OUT);
+       gpio_set_value(0, GPIO_LEVEL_LOW);
+
+       /*
+        * After reset, PMUSSI stays in reset mode.
+        * Now make it out of reset.
+        */
+       mmio_write_32(AO_SC_PERIPH_RSTDIS4,
+                     AO_SC_PERIPH_RSTDIS4_PRESET_PMUSSI_N);
+       do {
+               data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
+       } while (data & AO_SC_PERIPH_RSTDIS4_PRESET_PMUSSI_N);
+
+       /* Set PMUSSI clock latency for read operation. */
+       data = mmio_read_32(AO_SC_MCU_SUBSYS_CTRL3);
+       data &= ~AO_SC_MCU_SUBSYS_CTRL3_RCLK_MASK;
+       data |= AO_SC_MCU_SUBSYS_CTRL3_RCLK_3;
+       mmio_write_32(AO_SC_MCU_SUBSYS_CTRL3, data);
+
+       /* enable PMUSSI clock */
+       data = AO_SC_PERIPH_CLKEN5_PCLK_PMUSSI_CCPU |
+              AO_SC_PERIPH_CLKEN5_PCLK_PMUSSI_MCU;
+       mmio_write_32(AO_SC_PERIPH_CLKEN5, data);
+       data = AO_SC_PERIPH_CLKEN4_PCLK_PMUSSI;
+       mmio_write_32(AO_SC_PERIPH_CLKEN4, data);
+
+       gpio_set_value(0, GPIO_LEVEL_HIGH);
+}
+
+static void hikey_hi6553_init(void)
+{
+       uint8_t data;
+
+       mmio_write_8(HI6553_PERI_EN_MARK, 0x1e);
+       mmio_write_8(HI6553_NP_REG_ADJ1, 0);
+       data = DISABLE6_XO_CLK_CONN | DISABLE6_XO_CLK_NFC |
+               DISABLE6_XO_CLK_RF1 | DISABLE6_XO_CLK_RF2;
+       mmio_write_8(HI6553_DISABLE6_XO_CLK, data);
+
+       /* configure BUCK0 & BUCK1 */
+       mmio_write_8(HI6553_BUCK01_CTRL2, 0x5e);
+       mmio_write_8(HI6553_BUCK0_CTRL7, 0x10);
+       mmio_write_8(HI6553_BUCK1_CTRL7, 0x10);
+       mmio_write_8(HI6553_BUCK0_CTRL5, 0x1e);
+       mmio_write_8(HI6553_BUCK1_CTRL5, 0x1e);
+       mmio_write_8(HI6553_BUCK0_CTRL1, 0xfc);
+       mmio_write_8(HI6553_BUCK1_CTRL1, 0xfc);
+
+       /* configure BUCK2 */
+       mmio_write_8(HI6553_BUCK2_REG1, 0x4f);
+       mmio_write_8(HI6553_BUCK2_REG5, 0x99);
+       mmio_write_8(HI6553_BUCK2_REG6, 0x45);
+       mdelay(1);
+       mmio_write_8(HI6553_VSET_BUCK2_ADJ, 0x22);
+       mdelay(1);
+
+       /* configure BUCK3 */
+       mmio_write_8(HI6553_BUCK3_REG3, 0x02);
+       mmio_write_8(HI6553_BUCK3_REG5, 0x99);
+       mmio_write_8(HI6553_BUCK3_REG6, 0x41);
+       mmio_write_8(HI6553_VSET_BUCK3_ADJ, 0x02);
+       mdelay(1);
+
+       /* configure BUCK4 */
+       mmio_write_8(HI6553_BUCK4_REG2, 0x9a);
+       mmio_write_8(HI6553_BUCK4_REG5, 0x99);
+       mmio_write_8(HI6553_BUCK4_REG6, 0x45);
+
+       /* configure LDO20 */
+       mmio_write_8(HI6553_LDO20_REG_ADJ, 0x50);
+
+       mmio_write_8(HI6553_NP_REG_CHG, 0x0f);
+       mmio_write_8(HI6553_CLK_TOP0, 0x06);
+       mmio_write_8(HI6553_CLK_TOP3, 0xc0);
+       mmio_write_8(HI6553_CLK_TOP4, 0x00);
+
+       /* configure LDO7 & LDO10 for SD slot */
+       /* enable LDO7 */
+       data = mmio_read_8(HI6553_LDO7_REG_ADJ);
+       data = (data & 0xf8) | 0x2;
+       mmio_write_8(HI6553_LDO7_REG_ADJ, data);
+       mdelay(5);
+       mmio_write_8(HI6553_ENABLE2_LDO1_8, 1 << 6);
+       mdelay(5);
+       /* enable LDO10 */
+       data = mmio_read_8(HI6553_LDO10_REG_ADJ);
+       data = (data & 0xf8) | 0x5;
+       mmio_write_8(HI6553_LDO10_REG_ADJ, data);
+       mdelay(5);
+       mmio_write_8(HI6553_ENABLE3_LDO9_16, 1 << 1);
+       mdelay(5);
+       /* enable LDO15 */
+       data = mmio_read_8(HI6553_LDO15_REG_ADJ);
+       data = (data & 0xf8) | 0x4;
+       mmio_write_8(HI6553_LDO15_REG_ADJ, data);
+       mmio_write_8(HI6553_ENABLE3_LDO9_16, 1 << 6);
+       mdelay(5);
+       /* enable LDO19 */
+       data = mmio_read_8(HI6553_LDO19_REG_ADJ);
+       data |= 0x7;
+       mmio_write_8(HI6553_LDO19_REG_ADJ, data);
+       mmio_write_8(HI6553_ENABLE4_LDO17_22, 1 << 2);
+       mdelay(5);
+       /* enable LDO21 */
+       data = mmio_read_8(HI6553_LDO21_REG_ADJ);
+       data = (data & 0xf8) | 0x3;
+       mmio_write_8(HI6553_LDO21_REG_ADJ, data);
+       mmio_write_8(HI6553_ENABLE4_LDO17_22, 1 << 4);
+       mdelay(5);
+       /* enable LDO22 */
+       data = mmio_read_8(HI6553_LDO22_REG_ADJ);
+       data = (data & 0xf8) | 0x7;
+       mmio_write_8(HI6553_LDO22_REG_ADJ, data);
+       mmio_write_8(HI6553_ENABLE4_LDO17_22, 1 << 5);
+       mdelay(5);
+
+       /* select 32.764KHz */
+       mmio_write_8(HI6553_CLK19M2_600_586_EN, 0x01);
+
+       /* Disable vbus_det interrupts */
+       data = mmio_read_8(HI6553_IRQ2_MASK);
+       data = data | 0x3;
+       mmio_write_8(HI6553_IRQ2_MASK, data);
+}
+
+static void init_mmc0_pll(void)
+{
+       unsigned int data;
+
+       /* select SYSPLL as the source of MMC0 */
+       /* select SYSPLL as the source of MUX1 (SC_CLK_SEL0) */
+       mmio_write_32(PERI_SC_CLK_SEL0, 1 << 5 | 1 << 21);
+       do {
+               data = mmio_read_32(PERI_SC_CLK_SEL0);
+       } while (!(data & (1 << 5)));
+       /* select MUX1 as the source of MUX2 (SC_CLK_SEL0) */
+       mmio_write_32(PERI_SC_CLK_SEL0, 1 << 29);
+       do {
+               data = mmio_read_32(PERI_SC_CLK_SEL0);
+       } while (data & (1 << 13));
+
+       mmio_write_32(PERI_SC_PERIPH_CLKEN0, (1 << 0));
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (!(data & (1 << 0)));
+
+       data = mmio_read_32(PERI_SC_PERIPH_CLKEN12);
+       data |= 1 << 1;
+       mmio_write_32(PERI_SC_PERIPH_CLKEN12, data);
+
+       do {
+               mmio_write_32(PERI_SC_CLKCFG8BIT1, (1 << 7) | 0xb);
+               data = mmio_read_32(PERI_SC_CLKCFG8BIT1);
+       } while ((data & 0xb) != 0xb);
+}
+
+static void reset_mmc0_clk(void)
+{
+       unsigned int data;
+
+       /* disable mmc0 bus clock */
+       mmio_write_32(PERI_SC_PERIPH_CLKDIS0, PERI_CLK0_MMC0);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (data & PERI_CLK0_MMC0);
+       /* enable mmc0 bus clock */
+       mmio_write_32(PERI_SC_PERIPH_CLKEN0, PERI_CLK0_MMC0);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (!(data & PERI_CLK0_MMC0));
+       /* reset mmc0 clock domain */
+       mmio_write_32(PERI_SC_PERIPH_RSTEN0, PERI_RST0_MMC0);
+
+       /* bypass mmc0 clock phase */
+       data = mmio_read_32(PERI_SC_PERIPH_CTRL2);
+       data |= 3;
+       mmio_write_32(PERI_SC_PERIPH_CTRL2, data);
+
+       /* disable low power */
+       data = mmio_read_32(PERI_SC_PERIPH_CTRL13);
+       data |= 1 << 3;
+       mmio_write_32(PERI_SC_PERIPH_CTRL13, data);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
+       } while (!(data & PERI_RST0_MMC0));
+
+       /* unreset mmc0 clock domain */
+       mmio_write_32(PERI_SC_PERIPH_RSTDIS0, PERI_RST0_MMC0);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
+       } while (data & PERI_RST0_MMC0);
+}
+
+static void init_media_clk(void)
+{
+       unsigned int data, value;
+
+       data = mmio_read_32(PMCTRL_MEDPLLCTRL);
+       data |= 1;
+       mmio_write_32(PMCTRL_MEDPLLCTRL, data);
+
+       for (;;) {
+               data = mmio_read_32(PMCTRL_MEDPLLCTRL);
+               value = 1 << 28;
+               if ((data & value) == value)
+                       break;
+       }
+
+       data = mmio_read_32(PERI_SC_PERIPH_CLKEN12);
+       data = 1 << 10;
+       mmio_write_32(PERI_SC_PERIPH_CLKEN12, data);
+}
 
+static void init_mmc1_pll(void)
+{
+       uint32_t data;
+
+       /* select SYSPLL as the source of MMC1 */
+       /* select SYSPLL as the source of MUX1 (SC_CLK_SEL0) */
+       mmio_write_32(PERI_SC_CLK_SEL0, 1 << 11 | 1 << 27);
+       do {
+               data = mmio_read_32(PERI_SC_CLK_SEL0);
+       } while (!(data & (1 << 11)));
+       /* select MUX1 as the source of MUX2 (SC_CLK_SEL0) */
+       mmio_write_32(PERI_SC_CLK_SEL0, 1 << 30);
+       do {
+               data = mmio_read_32(PERI_SC_CLK_SEL0);
+       } while (data & (1 << 14));
+
+       mmio_write_32(PERI_SC_PERIPH_CLKEN0, (1 << 1));
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (!(data & (1 << 1)));
+
+       data = mmio_read_32(PERI_SC_PERIPH_CLKEN12);
+       data |= 1 << 2;
+       mmio_write_32(PERI_SC_PERIPH_CLKEN12, data);
+
+       do {
+               /* 1.2GHz / 50 = 24MHz */
+               mmio_write_32(PERI_SC_CLKCFG8BIT2, 0x31 | (1 << 7));
+               data = mmio_read_32(PERI_SC_CLKCFG8BIT2);
+       } while ((data & 0x31) != 0x31);
+}
+
+static void reset_mmc1_clk(void)
+{
+       unsigned int data;
+
+       /* disable mmc1 bus clock */
+       mmio_write_32(PERI_SC_PERIPH_CLKDIS0, PERI_CLK0_MMC1);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (data & PERI_CLK0_MMC1);
+       /* enable mmc1 bus clock */
+       mmio_write_32(PERI_SC_PERIPH_CLKEN0, PERI_CLK0_MMC1);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (!(data & PERI_CLK0_MMC1));
+       /* reset mmc1 clock domain */
+       mmio_write_32(PERI_SC_PERIPH_RSTEN0, PERI_RST0_MMC1);
+
+       /* bypass mmc1 clock phase */
+       data = mmio_read_32(PERI_SC_PERIPH_CTRL2);
+       data |= 3 << 2;
+       mmio_write_32(PERI_SC_PERIPH_CTRL2, data);
+
+       /* disable low power */
+       data = mmio_read_32(PERI_SC_PERIPH_CTRL13);
+       data |= 1 << 4;
+       mmio_write_32(PERI_SC_PERIPH_CTRL13, data);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
+       } while (!(data & PERI_RST0_MMC1));
+
+       /* unreset mmc0 clock domain */
+       mmio_write_32(PERI_SC_PERIPH_RSTDIS0, PERI_RST0_MMC1);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
+       } while (data & PERI_RST0_MMC1);
+}
+
+/* Initialize PLL of both eMMC and SD controllers. */
+static void hikey_mmc_pll_init(void)
+{
+       init_mmc0_pll();
+       reset_mmc0_clk();
+       init_media_clk();
+
+       dsb();
+
+       init_mmc1_pll();
+       reset_mmc1_clk();
+}
+
+static void hikey_rtc_init(void)
+{
+       uint32_t data;
+
+       data = mmio_read_32(AO_SC_PERIPH_CLKEN4);
+       data |= AO_SC_PERIPH_RSTDIS4_RESET_RTC0_N;
+       mmio_write_32(AO_SC_PERIPH_CLKEN4, data);
+}
+
+void bl2_el3_early_platform_setup(u_register_t arg1, u_register_t arg2,
+                                 u_register_t arg3, u_register_t arg4)
+{
        /* Initialize the console to provide early debug support */
        console_init(CONSOLE_BASE, PL011_UART_CLK_IN_HZ, PL011_BAUDRATE);
+       /*
+        * Allow BL2 to see the whole Trusted RAM.
+        */
+       bl2_el3_tzram_layout.total_base = BL2_RW_BASE;
+       bl2_el3_tzram_layout.total_size = BL31_LIMIT - BL2_RW_BASE;
+}
 
-       /* Setup the BL2 memory layout */
-       bl2_tzram_layout = *mem_layout;
+void bl2_el3_plat_arch_setup(void)
+{
+       hikey_init_mmu_el3(bl2_el3_tzram_layout.total_base,
+                          bl2_el3_tzram_layout.total_size,
+                          BL2_RO_BASE,
+                          BL2_RO_LIMIT,
+                          BL2_COHERENT_RAM_BASE,
+                          BL2_COHERENT_RAM_LIMIT);
+}
 
-       /* Clear SRAM since it'll be used by MCU right now. */
-       memset((void *)SRAM_BASE, 0, SRAM_SIZE);
-       clean_dcache_range(SRAM_BASE, SRAM_SIZE);
+void bl2_platform_setup(void)
+{
+       dw_mmc_params_t params;
+
+       hikey_sp804_init();
+       hikey_gpio_init();
+       hikey_pmussi_init();
+       hikey_hi6553_init();
 
-       sp804_timer_init(SP804_TIMER0_BASE, 10, 192);
        dsb();
        hikey_ddr_init();
+       hikey_security_setup();
+
+       /* Clear SRAM since it'll be used by MCU right now. */
+       memset((void *)SRAM_BASE, 0, SRAM_SIZE);
+       clean_dcache_range(SRAM_BASE, SRAM_SIZE);
 
        hikey_boardid_init();
        init_acpu_dvfs();
+       hikey_rtc_init();
        hikey_sd_init();
        hikey_jumper_init();
 
+       hikey_mmc_pll_init();
+
        reset_dwmmc_clk();
        memset(&params, 0, sizeof(dw_mmc_params_t));
        params.reg_base = DWMMC0_BASE;
@@ -299,18 +710,3 @@ void bl2_early_platform_setup(meminfo_t *mem_layout)
 
        hikey_io_setup();
 }
-
-void bl2_plat_arch_setup(void)
-{
-       hikey_init_mmu_el1(bl2_tzram_layout.total_base,
-                          bl2_tzram_layout.total_size,
-                          BL2_RO_BASE,
-                          BL2_RO_LIMIT,
-                          BL2_COHERENT_RAM_BASE,
-                          BL2_COHERENT_RAM_LIMIT);
-}
-
-void bl2_platform_setup(void)
-{
-       hikey_security_setup();
-}
index 57c66d501b64ffea1b8f5c99e496f7980c2ececf..90c2f8165d8178fa6ec55541e758355b757954a7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -65,10 +65,6 @@ static const io_block_dev_spec_t emmc_dev_spec = {
        .block_size     = EMMC_BLOCK_SIZE,
 };
 
-static const io_uuid_spec_t bl2_uuid_spec = {
-       .uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2,
-};
-
 static const io_uuid_spec_t bl31_uuid_spec = {
        .uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31,
 };
@@ -99,11 +95,6 @@ static const struct plat_io_policy policies[] = {
                (uintptr_t)&emmc_fip_spec,
                check_emmc
        },
-       [BL2_IMAGE_ID] = {
-               &fip_dev_handle,
-               (uintptr_t)&bl2_uuid_spec,
-               check_fip
-       },
        [SCP_BL2_IMAGE_ID] = {
                &fip_dev_handle,
                (uintptr_t)&scp_bl2_uuid_spec,
index 36418e17424f4e0ffc3b02c916fb3e58c790e958..ae99d5849a13d9e6b5d47ae52114858432d76be3 100644 (file)
 
 /*
  * BL2 specific defines.
+ *
+ * Both loader and BL2 region stay in SRAM.
+ * Loader is used to switch Hi6220 SoC from 32-bit to 64-bit mode.
+ *
+ * ++++++++++ 0xF980_0000
+ * + loader +
+ * ++++++++++ 0xF980_1000
+ * +  BL2   +
+ * ++++++++++ 0xF981_8000
  */
-#define BL2_BASE                       (BL1_RW_BASE + 0x8000)  /* 0xf981_8000 */
-#define BL2_LIMIT                      (BL2_BASE + 0x40000)
+#define BL2_BASE                       (BL1_RO_BASE)           /* 0xf980_1000 */
+#define BL2_LIMIT                      (0xF9818000)            /* 0xf981_8000 */
 
 /*
  * SCP_BL2 specific defines.
 /*
  * BL31 specific defines.
  */
-#define BL31_BASE                      BL2_LIMIT /* 0xf985_8000 */
-#define BL31_LIMIT                     0xF9898000
+#define BL31_BASE                      (0xF9858000)            /* 0xf985_8000 */
+#define BL31_LIMIT                     (0xF9898000)
 
 /*
  * BL3-2 specific defines.
 #endif /* SPD_none */
 #endif
 
-#define NS_BL1U_BASE                   (BL2_BASE)
+#define NS_BL1U_BASE                   (0xf9818000)
 #define NS_BL1U_SIZE                   (0x00010000)
 #define NS_BL1U_LIMIT                  (NS_BL1U_BASE + NS_BL1U_SIZE)
 
 #endif
 
 #ifdef IMAGE_BL2
-#if LOAD_IMAGE_V2
-#ifdef SPD_opteed
 #define MAX_XLAT_TABLES                        4
-#else
-#define MAX_XLAT_TABLES                        3
-#endif
-#else
-#define MAX_XLAT_TABLES                        3
-#endif
 #endif
 
 #define MAX_MMAP_REGIONS               16
index faaf88f36cc82f370dbf3620521acbaf5de569cb..9add4b444f426c3bfcb0c1c917a098d8e1258e2d 100644 (file)
@@ -7,6 +7,9 @@
 # Enable version2 of image loading
 LOAD_IMAGE_V2  :=      1
 
+# Non-TF Boot ROM
+BL2_AT_EL3     :=      1
+
 # On Hikey, the TSP can execute from TZC secure area in DRAM (default)
 # or SRAM.
 HIKEY_TSP_RAM_LOCATION :=      dram
@@ -70,13 +73,16 @@ BL1_SOURCES         +=      bl1/tbbr/tbbr_img_desc.c                \
                                plat/hisilicon/hikey/hikey_io_storage.c
 
 BL2_SOURCES            +=      common/desc_image_load.c                \
+                               drivers/arm/pl061/pl061_gpio.c          \
                                drivers/arm/sp804/sp804_delay_timer.c   \
                                drivers/delay_timer/delay_timer.c       \
+                               drivers/gpio/gpio.c                     \
                                drivers/io/io_block.c                   \
                                drivers/io/io_fip.c                     \
                                drivers/io/io_storage.c                 \
                                drivers/emmc/emmc.c                     \
                                drivers/synopsys/emmc/dw_mmc.c          \
+                               lib/cpus/aarch64/cortex_a53.S           \
                                plat/hisilicon/hikey/aarch64/hikey_helpers.S \
                                plat/hisilicon/hikey/hikey_bl2_mem_params_desc.c \
                                plat/hisilicon/hikey/hikey_bl2_setup.c  \